package br.com.sisgerenciamento.facade.recebimento;

import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.Date;

import br.com.sisgerenciamento.dao.recebimento.RecebimentoDAOService;
import br.com.sisgerenciamento.dto.recebimento.RecebimentoDTO;
import br.com.sisgerenciamento.exceptions.AlterarException;
import br.com.sisgerenciamento.exceptions.ApplicationException;
import br.com.sisgerenciamento.exceptions.InserirException;
import br.com.sisgerenciamento.facade.pedido.PedidoFacade;
import br.com.sisgerenciamento.facade.usuario.UsuarioFacade;
import br.com.sisgerenciamento.model.recebimento.RecebimentoVO;
import br.com.sisgerenciamento.spring.ConfiguracaoSpring;

public class RecebimentoFacade {
	private static RecebimentoFacade recebimentoFacade;
	private RecebimentoDAOService dao;

	public static RecebimentoFacade getInstance(){
		if(recebimentoFacade == null){
			recebimentoFacade =  new RecebimentoFacade();
		}
		return recebimentoFacade;
	}
	
	private RecebimentoFacade(){
		dao = (RecebimentoDAOService) ConfiguracaoSpring.SPRING_BEAN_FACTORY.getBean( "recebimentoDAO" );
	}
	
	public RecebimentoDTO salvar(RecebimentoDTO dto){
		try {
			RecebimentoVO vo = dto.getVO();
			vo = dao.inserir(vo);
			dto = dao.consultarPorCodigo(vo.getCodigo()).getDTO();
		} catch (InserirException e) {
			e.printStackTrace();
		} catch (ApplicationException e) {
			e.printStackTrace();
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}
		return dto;
	}
	
	public void alterar(RecebimentoDTO dto, Long codigoPedido){
		try {
			RecebimentoVO vo = dto.getVO();
			
			RecebimentoVO recebimento = dao.consultarPorCodigo(vo.getCodigo());
			
			vo.setPedido(recebimento.getPedido());
			vo.setPendente(false);
			vo.setDataHoraRecebimento(new Date());
			
			dao.alterar(vo);
		} catch (AlterarException e) {
			e.printStackTrace();
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} catch (ApplicationException e) {
			e.printStackTrace();
		} 
	}
	
	public RecebimentoDTO consultarPorCodigo(Long codigo){
		RecebimentoDTO dto = new RecebimentoDTO();
		try {
			RecebimentoVO vo = dao.consultarPorCodigo(codigo);
			if(vo != null)
				dto = vo.getDTO();
		} catch (ApplicationException e) {
			e.printStackTrace();
		}
		return dto;
	}
	
	public void extornar(Long codigo){
		try {
			RecebimentoVO recebimento = dao.consultarPorCodigo(codigo);
			
			recebimento.setPendente(true);
			recebimento.setDataHoraRecebimento(null);
			
			dao.alterar(recebimento);
		} catch (AlterarException e) {
			e.printStackTrace();
		} catch (ApplicationException e) {
			e.printStackTrace();
		} 
	}
	
	public ArrayList<RecebimentoDTO> buscarRecebimentoPorNomeCliente(String nomeCliente){
		ArrayList<RecebimentoDTO> dtos = new ArrayList<RecebimentoDTO>();
		try {
			dtos = dao.consultarRecebimentoPorNomeCliente(nomeCliente);
			for (RecebimentoDTO recebimentoDTO : dtos) {
				recebimentoDTO.setPedido(PedidoFacade.getInstance().obter(recebimentoDTO.getCodigoPedido()));
				if(recebimentoDTO.getCodigoUsuario() != null){
					recebimentoDTO.setUsuario(UsuarioFacade.getInstance().obterUsuarioLogado(recebimentoDTO.getCodigoUsuario()));
				}
			}
		} catch (ApplicationException e) {
			e.printStackTrace();
		}
		return dtos;
	}
	
	public ArrayList<RecebimentoDTO> listarPendentes(){
		ArrayList<RecebimentoDTO> dtos = new ArrayList<RecebimentoDTO>();
		try {
			ArrayList<RecebimentoVO> vos = dao.listarPendentes();
			if(vos != null)
			for (RecebimentoVO vo : vos) {
				RecebimentoDTO dto = vo.getDTO();
				dto.setCodigoPedido(vo.getPedido().getCodigo());
				dto.setPedido(vo.getPedido().getDTO());
				dto.setNomeCliente(vo.getPedido().getCliente().getNome());
				dtos.add(dto);
			}
		} catch (ApplicationException e) {
			e.printStackTrace();
		}
		return dtos;
	}

	public ArrayList<RecebimentoDTO> buscarRecebimentoPorPedido(Long codigoPedido) {
		ArrayList<RecebimentoDTO> dtos = new ArrayList<RecebimentoDTO>();
		try {
			dtos = dao.consultarRecebimentoPorPedido(codigoPedido);
			for (RecebimentoDTO recebimentoDTO : dtos) {
				recebimentoDTO.setPedido(PedidoFacade.getInstance().obter(recebimentoDTO.getCodigoPedido()));
				if(recebimentoDTO.getCodigoUsuario() != null){
					recebimentoDTO.setUsuario(UsuarioFacade.getInstance().obterUsuarioLogado(recebimentoDTO.getCodigoUsuario()));
				}
			}
		} catch (ApplicationException e) {
			e.printStackTrace();
		}
		return dtos;
	}
}
